/***
 * post请求解析
 */
const fs = require("fs")

//处理数据
module.exports=function toDealWith(par,data,head,tail){
    //对数据进行分组
    data.split(new RegExp(`0d0a${head}0d0a|${head}0d0a|0d0a${tail}0d0a`)).filter(e=>e).forEach(e=>{
        //判断有没有头数据
        if(e.includes("436f6e74656e742d446973706f736974696f6e")){
            let index = e.indexOf("0d0a0d0a");
            //把temporary中的数据保存好
            if(par.temporary.name){par.parameter[par.temporary.name]=processData(par.temporary);par.temporary={}}
            //这是头部数据，解析属性
            par.temporary = jxname(e.substring(0,index));
            //获取后面的所有数据
            //判断是文件还是普通变量
            if(par.temporary.filename)
                (par.temporary.path=wrfile(process.cwd()+"\\.temporary\\"+time()+"_"+par.temporary.filename,e.substring(index+8)));
            else
                par.temporary.data = e.substring(index+8);
        }else{

            //不是头部数据,判断一下是不是文件
            if(par.temporary.filename){
                wrfile(par.temporary.path,e,false);
            }else{
                par.temporary.data+=e;
            }
        }
    })
    //判断是否结束
    if(data.endsWith(tail+"0d0a") && par.temporary.name){
        par.parameter[par.temporary.name]=processData(par.temporary)
    }
}


//解析出参数，名称以及文件名称,如果有文件名称的话
function jxname(str){
    // 如果数据中不包含Content-Disposition直接返回,这是一种保险措施
    if(!str.includes('436f6e74656e742d446973706f736974696f6e')){return false}
    //把\r\n替换为;
    str =Buffer.from(str.replace(/0d0a/g,"3b20").replace(/22/g,""),'hex').toString();
    let obj = {};
    str.split("; ").forEach(e=>{
        let data = e.split(/: |=/g);
        obj[data[0]]=data[1];
    })
    return obj;
}


//把文件保存到临时目录
function wrfile(path,data,continuing=true){
    //变为二进制数据
    data = Buffer.from(data,"hex");
    //没有临时文件夹就创建
    if(!fs.existsSync(process.cwd()+'/.temporary')){fs.mkdirSync(process.cwd()+'\\.temporary')}
    //如果continuing默认为true，那就代表这是新文件，直接创建
    if(continuing){
        fs.writeFileSync(path,data,"binary");
    }else{
        //否则就在原有文件的情况下把数据追加进去
        fs.appendFileSync(path,data,"binary");
    }
    return path;
}

//解析数据
function processData(obj){
    if(obj.filename){
        //这是一个文件
        if(obj.path){
            return maxfile(obj)
        }
        return minfile(obj);
    }
    //这不是一个文件
    obj.data = Buffer.from(obj.data,'hex').toString();

    //是普通数据,这里需要使用json转化
    try{
        return JSON.parse(obj.data);
    }catch (e){
        return obj.data;
    }
}

//生成大文件对象
function maxfile(obj){
    obj.read=()=>fs.readFileSync(obj.path);
    obj.write=(pa)=>{
        fs.createReadStream(obj.path).pipe(fs.createWriteStream(pa))
        fs.unlinkSync(obj.path);
    }
    obj.delete=()=>{fs.unlinkSync(obj.path);}
    async_global.$file.push(obj);
    try{
        obj.size = fs.statSync(obj.path).size;
    }catch(err){
        console.log(err);
    }
    return obj;
}

function minfile(obj){
    obj.read=()=>Buffer.from(obj.data,'hex').toString('utf-8');
    obj.write=(pa)=>{
        fs.writeFileSync(pa,Buffer.from(obj.data,'hex'));
    }
    obj.size = Buffer.byteLength(obj.data,'hex');
    return obj;
}